package br.boicotando.server;

import org.hibernate.Session;
import org.hibernate.Transaction;

import br.boicotando.client.GerenciadorCompra;
import br.boicotando.dao.CarrinhoDao;
import br.boicotando.dao.CarrinhoDaoDB;
import br.boicotando.dao.DaoDB;
import br.boicotando.dao.ProdutoDao;
import br.boicotando.dao.ProdutoDaoDB;
import br.boicotando.dominio.Carrinho;
import br.boicotando.persistencia.ECarrinho;
import br.boicotando.persistencia.EItemCarrinho;
import br.boicotando.persistencia.EProduto;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

@SuppressWarnings("serial")
public class GerenciadorCompraImpl extends RemoteServiceServlet implements GerenciadorCompra {


	private ECarrinho recuperaCarrinhoSessao() throws IllegalArgumentException {
		ECarrinho eCarrinho = (ECarrinho) getThreadLocalRequest().getSession().getAttribute("CARRINHO");
		if (eCarrinho == null) {
			String idCliente = (String) getThreadLocalRequest().getSession().getAttribute("CLIENTE_ID");
			if (idCliente == null) {
				eCarrinho = new ECarrinho();
			} else {
				Session sess = null;
				try {
					CarrinhoDao carrinhoDao = new CarrinhoDaoDB(sess = DaoDB.abreSessao());
					eCarrinho = carrinhoDao.consultaCarrinhoAberto(idCliente);
				} catch (Throwable e) {
					e.printStackTrace();
					throw new IllegalArgumentException(e.getMessage());
				} finally {
					if (sess != null && sess.isOpen()) {
						sess.close();
					}
				}
				if (eCarrinho == null) {
					eCarrinho = new ECarrinho();
				}
			}
			getThreadLocalRequest().getSession().setAttribute("CARRINHO", eCarrinho);
		}
        return eCarrinho;		
	}
	
	
	@Override
	public Carrinho recuperaCarrinho() throws IllegalArgumentException {
		ECarrinho eCarrinho = recuperaCarrinhoSessao();
		return (Carrinho) Bau.injetor().injetaA(eCarrinho).emB(new Carrinho());
	}

	@Override
	public Boolean adicionaItemCarrinho(String idProduto) throws IllegalArgumentException {
		String idCliente = (String) getThreadLocalRequest().getSession().getAttribute("CLIENTE_ID");
		Boolean adiciona = new Boolean(true);
		ECarrinho eCarrinho = recuperaCarrinhoSessao();
		Session sess = null;
		Transaction tran = null;
		for (EItemCarrinho eItemCarrinho : eCarrinho.getItens(new EItemCarrinho[0])) {
			if (eItemCarrinho.getProduto().getId().equals(idProduto)) {
				adiciona = new Boolean(false);
			}
		}
		if (adiciona.booleanValue()) {
			try {
				ProdutoDao produtoDao = new ProdutoDaoDB(sess = DaoDB.abreSessao());
				EProduto eProduto = produtoDao.consultarId(idProduto);
				if (eProduto == null) {
					adiciona = new Boolean(false);
				} else {
					EItemCarrinho eItemCarrinho = new EItemCarrinho();
					eItemCarrinho.setProduto(eProduto);
					eItemCarrinho.setQtd(new Integer(1));
					eCarrinho.adicionaItem(eItemCarrinho);
					if (idCliente != null) {
						tran = sess.beginTransaction();
						CarrinhoDao carrinhoDao = new CarrinhoDaoDB(sess);
						carrinhoDao.salvar(eCarrinho);
					}
				}
			} catch (Throwable e) {
				if (tran != null && tran.isActive()) {
					tran.rollback();
				}
				e.printStackTrace();
				throw new IllegalArgumentException(e.getMessage());
			} finally {
				if (sess != null && sess.isOpen()) {
					if (tran != null && tran.isActive()) {
						tran.commit();
					}
					sess.close();
				}
			}
		}
		return adiciona;
	}

	@Override
	public Boolean excluiItemCarrinho(String idProduto) throws IllegalArgumentException {
		String idCliente = (String) getThreadLocalRequest().getSession().getAttribute("CLIENTE_ID");
		Boolean exclui = new Boolean(false);
		ECarrinho eCarrinho = recuperaCarrinhoSessao();
		EItemCarrinho eItem = null;
		Session sess = null;
		Transaction tran = null;
		for (EItemCarrinho eItemCarrinho : eCarrinho.getItens(new EItemCarrinho[0])) {
			if (eItemCarrinho.getProduto().getId().equals(idProduto)) {
				exclui = new Boolean(true);
				eItem = eItemCarrinho;
			}
		}
		if (exclui.booleanValue()) {
			eCarrinho.removeItem(eItem);
			if (idCliente != null) {
				try {
					CarrinhoDao carrinhoDao = new CarrinhoDaoDB(sess = DaoDB.abreSessao());
					tran = sess.beginTransaction();
					sess.delete(eItem);
					carrinhoDao.salvar(eCarrinho);
				} catch (Throwable e) {
					if (tran != null && tran.isActive()) {
						tran.rollback();
					}
					e.printStackTrace();
					throw new IllegalArgumentException(e.getMessage());
				} finally {
					if (sess != null && sess.isOpen()) {
						if (tran != null && tran.isActive()) {
							tran.commit();
						}
						sess.close();
					}
				}
			}
		}
		return exclui;
	}

	@Override
	public Boolean alteraQuantidadeItemCarrinho(String idItemCarrinho, int novaQuantidade) throws IllegalArgumentException {
		String idCliente = (String) getThreadLocalRequest().getSession().getAttribute("CLIENTE_ID");
		Boolean altera = new Boolean(false);
		ECarrinho eCarrinho = recuperaCarrinhoSessao();
		Session sess = null;
		Transaction tran = null;
		for (EItemCarrinho eItemCarrinho : eCarrinho.getItens(new EItemCarrinho[0])) {
			if (eItemCarrinho.getId().equals(idItemCarrinho)) {
				altera = new Boolean(true);
				eItemCarrinho.setQtd(novaQuantidade);
			}
		}
		if (altera.booleanValue()) {
			if (idCliente != null) {
				try {
					CarrinhoDao carrinhoDao = new CarrinhoDaoDB(sess = DaoDB.abreSessao());
					tran = sess.beginTransaction();
					carrinhoDao.salvar(eCarrinho);
				} catch (Throwable e) {
					if (tran != null && tran.isActive()) {
						tran.rollback();
					}
					e.printStackTrace();
					throw new IllegalArgumentException(e.getMessage());
				} finally {
					if (sess != null && sess.isOpen()) {
						if (tran != null && tran.isActive()) {
							tran.commit();
						}
						sess.close();
					}
				}
			}
		}
		return altera;
	}

}
